home *** CD-ROM | disk | FTP | other *** search
- package netscape.ldap;
-
- import java.util.Date;
- import java.util.Enumeration;
- import java.util.EventObject;
- import java.util.Hashtable;
- import java.util.Vector;
- import java.util.zip.CRC32;
- import netscape.ldap.util.DN;
-
- public class LDAPCache implements TimerEventListener {
- private Hashtable m_cache;
- private long m_timeToLive;
- private long m_maxSize;
- private String[] m_dns;
- private Vector m_orderedStruct;
- private long m_remainingSize;
- public static final String DELIM = "#";
- private Timer m_timer;
- private static long TIMEOUT = 60000L;
- private long m_totalOpers;
- private static final boolean m_debug = false;
- private long m_hits;
- private long m_flushes;
-
- public LDAPCache(long var1, long var3) {
- this.init(var1, var3);
- }
-
- public LDAPCache(long var1, long var3, String[] var5) {
- this.init(var1, var3);
- this.m_dns = new String[var5.length];
- if (var5 != null && var5.length > 0) {
- for(int var6 = 0; var6 < var5.length; ++var6) {
- this.m_dns[var6] = (new DN(var5[var6])).toString();
- }
- }
-
- }
-
- public long getSize() {
- return this.m_maxSize;
- }
-
- public long getTimeToLive() {
- return this.m_timeToLive / 1000L;
- }
-
- public String[] getBaseDNs() {
- return this.m_dns;
- }
-
- public synchronized boolean flushEntries(String var1, int var2) {
- if (var1 == null) {
- this.m_remainingSize = this.m_maxSize;
- this.m_cache.clear();
- this.m_orderedStruct.removeAllElements();
- return true;
- } else {
- DN var3 = new DN(var1);
- Enumeration var4 = this.m_cache.keys();
-
- while(var4.hasMoreElements()) {
- Long var5 = (Long)var4.nextElement();
- Vector var6 = (Vector)this.m_cache.get(var5);
- int var7 = 1;
-
- int var8;
- for(var8 = var6.size(); var7 < var8; ++var7) {
- String var9 = ((LDAPEntry)var6.elementAt(var7)).getDN();
- DN var10 = new DN(var9);
- if (var3.toRFCString().toUpperCase().equals(var10.toRFCString().toUpperCase())) {
- break;
- }
-
- if (var2 == 1) {
- DN var11 = var10.getParent();
- if (var3.toRFCString().toUpperCase().equals(var11.toRFCString().toUpperCase())) {
- break;
- }
- }
-
- if (var2 == 2 && var10.contains(var3)) {
- break;
- }
- }
-
- if (var7 < var8) {
- for(int var12 = 0; var12 < this.m_orderedStruct.size(); ++var12) {
- Vector var13 = (Vector)this.m_orderedStruct.elementAt(var12);
- if (var5.equals((Long)var13.elementAt(0))) {
- this.m_orderedStruct.removeElementAt(var12);
- break;
- }
- }
-
- this.m_cache.remove(var5);
- return true;
- }
- }
-
- return false;
- }
- }
-
- public void timerExpired(TimerEvent var1) {
- this.flushEntries();
- Timer var2 = (Timer)((EventObject)var1).getSource();
- var2.start();
- }
-
- public long getAvailableSize() {
- return this.m_remainingSize;
- }
-
- public long getTotalOperations() {
- return this.m_totalOpers;
- }
-
- public long getNumMisses() {
- return this.m_totalOpers - this.m_hits;
- }
-
- public long getNumHits() {
- return this.m_hits;
- }
-
- public long getNumFlushes() {
- return this.m_flushes;
- }
-
- Long createKey(String var1, int var2, String var3, String var4, int var5, String[] var6, String var7, LDAPSearchConstraints var8) throws LDAPException {
- DN var9 = new DN(var3);
- var3 = var9.toString();
- if (this.m_dns != null) {
- int var10;
- for(var10 = 0; var10 < this.m_dns.length && !var3.equals(this.m_dns[var10]); ++var10) {
- }
-
- if (var10 >= this.m_dns.length) {
- throw new LDAPException(var3 + " is not a cached base DN", 80);
- }
- }
-
- Object var18 = null;
- String var19 = var3 == null ? "null#" : var3.trim() + "#";
- var19 = var19 + var5 + "#";
- var19 = var19 + (var1 == null ? "null#" : var1.trim() + "#");
- var19 = var19 + var2 + "#";
- var19 = var19 + (var4 == null ? "null#" : var4.trim() + "#");
- var19 = var19 + this.appendString(var6);
- var19 = var19 + (var7 == null ? "null#" : var7.trim() + "#");
- LDAPControl[] var11 = null;
- LDAPControl[] var12 = null;
- if (var8 != null) {
- var11 = var8.getServerControls();
- var12 = var8.getClientControls();
- }
-
- if (var11 != null && var11.length > 0) {
- String[] var13 = new String[var11.length];
-
- for(int var14 = 0; var14 < var11.length; ++var14) {
- long var15 = this.getCRC32(var11[var14].getValue());
- var13[var14] = (new Long(var15)).toString();
- }
-
- var19 = var19 + this.appendString(var13);
- } else {
- var19 = var19 + 0 + "#";
- }
-
- if (var12 != null && var12.length > 0) {
- String[] var28 = new String[var12.length];
-
- for(int var30 = 0; var30 < var12.length; ++var30) {
- long var31 = this.getCRC32(var12[var30].getValue());
- var28[var30] = (new Long(var31)).toString();
- }
-
- var19 = var19 + this.appendString(var28);
- } else {
- var19 = var19 + 0 + "#";
- }
-
- long var29 = this.getCRC32(var19.getBytes());
- return new Long(var29);
- }
-
- synchronized Object getEntry(Long var1) {
- Object var2 = null;
- var2 = this.m_cache.get(var1);
- ++this.m_totalOpers;
- if (var2 != null) {
- ++this.m_hits;
- }
-
- return var2;
- }
-
- synchronized void flushEntries() {
- Object var1 = null;
- Date var2 = new Date();
- long var3 = var2.getTime();
-
- for(this.m_flushes = 0L; this.m_orderedStruct.size() > 0; ++this.m_flushes) {
- Vector var9 = (Vector)this.m_orderedStruct.firstElement();
- long var5 = var3 - (Long)var9.elementAt(1);
- if (var5 < this.m_timeToLive) {
- break;
- }
-
- Long var7 = (Long)var9.elementAt(0);
- Vector var8 = (Vector)this.m_cache.remove(var7);
- this.m_remainingSize += (Long)var8.firstElement();
- this.m_orderedStruct.removeElementAt(0);
- }
-
- }
-
- synchronized void addEntry(Long var1, Object var2) throws LDAPException {
- if (this.m_cache.get(var1) == null) {
- Vector var3 = (Vector)var2;
- long var4 = (Long)var3.elementAt(0) + 4L;
- if (var4 > this.m_maxSize) {
- throw new LDAPException("Failed to add an entry to the cache since the new entry exceeds the cache size", 80);
- } else {
- var3.setElementAt(new Long(var4), 0);
- if (var4 > this.m_remainingSize) {
- do {
- Vector var6 = (Vector)this.m_orderedStruct.firstElement();
- Long var7 = (Long)var6.elementAt(0);
- Vector var8 = (Vector)this.m_cache.remove(var7);
- this.m_orderedStruct.removeElementAt(0);
- this.m_remainingSize += (Long)var8.elementAt(0);
- } while(this.m_remainingSize < var4);
- }
-
- this.m_remainingSize -= var4;
- this.m_cache.put(var1, var3);
- Vector var9 = new Vector();
- var9.addElement(var1);
- Date var10 = new Date();
- var9.addElement(new Long(var10.getTime()));
- this.m_orderedStruct.addElement(var9);
- }
- }
- }
-
- int size() {
- return this.m_cache.size();
- }
-
- void cleanup() {
- this.m_timer.stop();
- }
-
- private void init(long var1, long var3) {
- this.m_cache = new Hashtable();
- this.m_timeToLive = var1 * 1000L;
- this.m_maxSize = var3;
- this.m_remainingSize = var3;
- this.m_dns = null;
- this.m_orderedStruct = new Vector();
- this.m_timer = new Timer(TIMEOUT);
- this.m_timer.addTimerExpiredEventListener(this);
- this.m_timer.start();
- }
-
- private String appendString(String var1) {
- return var1 == null ? "null#" : var1.trim() + "#";
- }
-
- private String appendString(int var1) {
- return var1 + "#";
- }
-
- private String appendString(String[] var1) {
- if (var1 != null && var1.length >= 1) {
- this.sortStrings(var1);
- String var2 = var1.length + "#";
-
- for(int var3 = 0; var3 < var1.length; ++var3) {
- var2 = var2 + var1[var3].trim() + "#";
- }
-
- return var2;
- } else {
- return "0#";
- }
- }
-
- private void sortStrings(String[] var1) {
- for(int var2 = 0; var2 < var1.length; ++var2) {
- var1[var2] = var1[var2].trim();
- }
-
- for(int var3 = 0; var3 < var1.length - 1; ++var3) {
- for(int var4 = var3 + 1; var4 < var1.length; ++var4) {
- if (var1[var3].compareTo(var1[var4]) > 0) {
- String var5 = var1[var3];
- var1[var3] = var1[var4];
- var1[var4] = var5;
- }
- }
- }
-
- }
-
- private long getCRC32(byte[] var1) {
- CRC32 var2 = new CRC32();
- var2.update(var1);
- return var2.getValue();
- }
- }
-